#include<stdio.h>       // here is four head files(the third is delete)
#include<string.h>
#include "los_task.h"   // here is the haisi los_task
#include "cmsis_os2.h"  // here is the better(more commonly)
#include "shell.h"

UINT32 g_taskHiID,g_taskLoID;  // 这里定义的全局变量为任务ID，存储高低两个变量

UINT32 Example_TaskHi(void)     // high level task
{
    UINT32 ret;     // rtorage return answer

    printf("Enter TaskHi Handler.\n");

    ret = LOS_TaskDelay(100);    // make a Delay waiting
    if (ret != LOS_OK)          // juede if success(compare with Hong define)
    {
        /* code */
        printf("Delay TaskHi Failed.\n");   // failed----unsuccess
        return LOS_NOK;     // unsuccess(Hong define)
    }

    // 100个tick时间之后任务恢复，继续执行
    printf("Task LOS_TaskDelay Done.\n");   // 打印延迟结束的提示

    ret = LOS_TaskSuspend(g_taskHiID);      // 挂起(参数是任务ID，才知道挂起的是谁)
    if (ret != LOS_OK)                      // 判断挂起是否成功
    {
        /* code */
        printf("Suspend TaskHi Failed.\n");
        return LOS_NOK;
    }
    printf("TaskHi Los_TaskResume Success.\n"); // 恢复成功（进入就绪态中）
    return ret;
}

UINT32 Example_TaskLo(void)         // 构建低级别任务（和高级别流程是一样的）
{
    UINT32 ret;     // rtorage return answer

    printf("Enter TaskLo Handler.\n");

    ret = LOS_TaskDelay(100);    // make a Delay waiting
    if (ret != LOS_OK)          // juede if success(compare with Hong define)
    {
        /* code */
        printf("Delay TaskLo Failed.\n");   // failed----unsuccess
        return LOS_NOK;     // unsuccess(Hong define)
    }
    printf("Task LOS_TaskDelay Done.\n");   // 打印延迟结束的提示
    ret = LOS_TaskResume(g_taskHiID);       // 顺便恢复高优先级的任务
    if (ret != LOS_OK)                      // 判断是否执行成功（失败的话做一个相关信息的打印）
    {
        /* code */
        printf("TaskLo TaskResume Failed.\n");
        return LOS_NOK;
    }
    return ret;
}

// 执行完这两个任务之后，创建两个不同优先级的任务函数
UINT32 Example_TaskCase(void)
{
    UINT32 ret;     // 存储当前执行调用的函数是否成功
    TSK_INIT_PARAM_S initParam;

    LOS_TaskLock();     // 锁任务调度，防止新创建的任务比本任务优先级高而发生调整
    printf("Example_TaskCase Success!\n");
    
    initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskHi;    // 先创建高级别的任务
    initParam.usTaskPrio = 20;      // 设置优先级
    initParam.uwStackSize = 4096;   // 栈的大小(一定是8的倍数)
    initParam.pcName = "TaskHi";    // 任务名

    // 创建高优先级任务，由于锁任务调度，任务创建成功后不会马上执行
    ret = LOS_TaskCreate(&g_taskHiID, &initParam);  // 创建函数(参数是一个指针)
    if(ret != LOS_OK)   // 判定是否创建成功
    {
        LOS_TaskUnlock();   //解锁

        printf("Example TaskHi create Failed!\n");
        return LOS_NOK;
    }
    // 任务测试入口函数，创建两个不同优先级的任务
    printf("Example TaskHi create Success!\n");

    initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskLo;
    initParam.usTaskPrio = 27;      // 这里的优先级别高级别要低
    initParam.pcName = "TaskLo";
    initParam.uwStackSize = 4096;

    // 创建低优先级任务，由于锁任务调度，任务创建成功后马上不会执行
    ret = LOS_TaskCreate(&g_taskLoID, &initParam);
    if(ret != LOS_OK)
    {
        LOS_TaskUnlock();
        
        printf("Example TaskLO create Failed");
        return LOS_NOK;
    }

    printf("Example TaskLo create Success!\n");

    // 解锁任务调度，此时会发生任务调度，执行就绪队列中最高优先级任务
    LOS_TaskUnlock();

    return LOS_OK;
}

void MyTask2(void)
{
    osCmdReg(CMD_TYPE_EX, "MyTask2", 0, Example_TaskCase);
    
}